//
//  Point3D.hpp
//  C3W_Demo_By_Fan
//
//  Created by 范静涛 on 2024/7/22.
//

//------------------------------------------------------------------------------
//【文件名】Point3D.hpp
//【功能模块和目的】三维点类声明
//【开发者及日期】范静涛 2024/7/22
//【更改记录】
//------------------------------------------------------------------------------

#ifndef Point3D_hpp
#define Point3D_hpp

//Vecor3D基类模版所属头文件
#include "Vector3D.hpp"

//------------------------------------------------------------------------------
//【类名】Point3D
//【功能】三维点类
//【接口说明】
//    继承了基类全部接口
//    默认构造函数
//    带参数构造函数
//    拷贝构造函数
//    赋值运算符overload
//    虚析构函数（可能做基类）
//    坐标直接访问，引用型数据成员(从概念出发，应存在的对象属性)
//【开发者及日期】 范静涛 2024/7/22
//【更改记录】
//------------------------------------------------------------------------------
class Point3D : public Vector3D<double>{
public:
    //--------------------------------------------------------------------------
    //必要的构造、析构、赋值行为
    //--------------------------------------------------------------------------
    //默认构造函数
    Point3D();
    //带参构造函数
    Point3D(double x, double y, double z);
    //带参数构造函数，用于基类对象初始化派生类对象
    Point3D(const Vector3D<double>& Source);
    //拷贝构造函数
    Point3D(const Point3D& Source);
    //赋值运算符overload
    Point3D& operator=(const Point3D Source);
    //赋值运算符overload，用于基类对象赋值给派生类对象
    Point3D& operator=(const Vector3D<double>& Source);
    //虚析构函数（可能做基类），无动态构造成员，默认实现
    virtual ~Point3D() = default;
    //--------------------------------------------------------------------------
    //非静态Seter/Getter共用成员
    //--------------------------------------------------------------------------
    //X坐标，同分量0
    double& X{Components[0]};
    //Y坐标，同分量1
    double& Y{Components[1]};
    //Z坐标，同分量2
    double& Z{Components[2]};
};

#endif /* Point3D_hpp */
